home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / gcc263-src.lha / gcc-2.6.3 / config / m68k / news.h < prev    next >
C/C++ Source or Header  |  1994-07-30  |  18KB  |  492 lines

  1. /* Definitions of target machine for GNU compiler.  SONY NEWS-OS 4 version.
  2.    Copyright (C) 1987, 1989, 1993, 1994 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #ifndef USE_GAS
  21. /* This controls conditionals in m68k.h.  */
  22. #define MOTOROLA        /* Use Motorola syntax rather than "MIT" */
  23. #define SGS_NO_LI        /* Suppress jump table label usage */
  24. #endif
  25.  
  26. #define NO_DOLLAR_IN_LABEL
  27. #define NO_DOT_IN_LABEL
  28.  
  29. #include "m68k/m68k.h"
  30.  
  31. /* See m68k.h.  7 means 68020 with 68881.  */
  32.  
  33. #define TARGET_DEFAULT 7
  34.  
  35. /* Define __HAVE_68881__ in preprocessor, unless -msoft-float is specified.
  36.    This will control the use of inline 68881 insns in certain macros.  */
  37.  
  38. #define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__}"
  39.  
  40. /* Names to predefine in the preprocessor for this target machine.  */
  41. /* These are the ones defined by Sony, plus mc68000 for uniformity with
  42.    GCC on other 68000 systems.  */
  43.  
  44. #ifdef MOTOROLA
  45. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews700 -D__motorola__ -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  46. #else
  47. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews700 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  48. #endif
  49.  
  50. /* These conditionals tested for different submodels,
  51.    but they were incorrect since they tested the host rather than the target.
  52.    The choice of model shouldn't actually matter.  */
  53.  
  54. #if 0
  55. #ifdef news800
  56. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews800 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  57. #endif
  58. #ifdef news900
  59. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews900 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  60. #endif
  61. #ifdef news1500
  62. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1500 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  63. #endif
  64. #ifdef news1700
  65. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1700 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  66. #endif
  67. #ifdef news1800
  68. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1800 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  69. #endif
  70. #ifdef news1900
  71. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1900 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  72. #endif
  73. #endif
  74.  
  75. /* Link with libg.a when debugging, for dbx's sake.  */
  76.  
  77. #define LIB_SPEC "%{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p} "
  78.  
  79. /* This is BSD, so it wants DBX format.  */
  80.  
  81. #define DBX_DEBUGGING_INFO
  82.  
  83. #if 0
  84. /* This is to be compatible with types.h.
  85.    It was found to be necessary with Newsos 3.  */
  86.  
  87. #define SIZE_TYPE "long int"
  88. #endif
  89.  
  90. /* Override parts of m68k.h to fit Sony's assembler syntax.  */
  91.  
  92. #undef BIGGEST_ALIGNMENT
  93. #undef CALL_USED_REGISTERS
  94. #undef FUNCTION_VALUE
  95. #undef LIBCALL_VALUE
  96. #undef FUNCTION_PROFILER
  97.  
  98. #ifdef MOTOROLA
  99. #undef FUNCTION_PROLOGUE
  100. #undef FUNCTION_EPILOGUE
  101. #undef REGISTER_NAMES
  102. #undef ASM_OUTPUT_REG_PUSH
  103. #undef ASM_OUTPUT_REG_POP
  104. #undef ASM_OUTPUT_DOUBLE
  105. #undef ASM_OUTPUT_SKIP
  106. #undef ASM_FORMAT_PRIVATE_NAME
  107. #undef PRINT_OPERAND
  108. #undef PRINT_OPERAND_ADDRESS
  109. #endif  
  110.  
  111. #undef ASM_OUTPUT_ALIGN
  112.  
  113. /* There is no point aligning anything to a rounder boundary than this.  */
  114. #define BIGGEST_ALIGNMENT 32
  115.  
  116. /* A bitfield declared as `int' forces `int' alignment for the struct.  */
  117. #define PCC_BITFIELD_TYPE_MATTERS 1
  118.   
  119. /* NEWS makes d2, d3, fp2 and fp3 unsaved registers, unlike the Sun system.  */
  120.   
  121. #define CALL_USED_REGISTERS \
  122.  {1, 1, 1, 1, 0, 0, 0, 0, \
  123.   1, 1, 0, 0, 0, 0, 0, 1, \
  124.   1, 1, 1, 1, 0, 0, 0, 0}
  125.  
  126. /* NEWS returns floats and doubles in fp0, not d0/d1.  */
  127.  
  128. #define FUNCTION_VALUE(VALTYPE,FUNC) LIBCALL_VALUE (TYPE_MODE (VALTYPE))
  129.  
  130. #define LIBCALL_VALUE(MODE)                           \
  131.  gen_rtx (REG, (MODE),                               \
  132.       ((TARGET_68881                           \
  133.         && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) \
  134.        ? 16 : 0))
  135.  
  136. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  137.   fprintf (FILE, "\t.align %d\n", (LOG))
  138.  
  139. #ifdef MOTOROLA
  140.  
  141. /* Don't try to define `gcc_compiled.' since the assembler does not
  142.    accept symbols with periods.  This is no real loss since GDB only
  143.    really needs it for parms passed in registers.  */
  144. #define ASM_IDENTIFY_GCC(FILE)
  145.  
  146. #define FUNCTION_PROLOGUE(FILE, SIZE)     \
  147. { register int regno;                        \
  148.   register int mask = 0;                    \
  149.   extern char call_used_regs[];                    \
  150.   int fsize = ((SIZE) + 3) & -4;                \
  151.   if (frame_pointer_needed)                    \
  152.     { if (fsize < 0x8000)                            \
  153.         fprintf (FILE, "\tlink fp,#%d\n", -fsize);        \
  154.       else if (TARGET_68020)                                    \
  155.         fprintf (FILE, "\tlink.l fp,#%d\n", -fsize);            \
  156.       else                            \
  157.     fprintf (FILE, "\tlink fp,#0\n\tsub.l #%d,sp\n", fsize);\
  158.     }                                \
  159.   else if (fsize)                        \
  160.     {                                \
  161.       int amt = fsize + 4;                    \
  162.       /* Adding negative number is faster on the 68040.  */    \
  163.       if (fsize + 4 < 0x8000)                    \
  164.     asm_fprintf (FILE, "\tadd.w %0I%d,%Rsp\n", - amt);    \
  165.       else                            \
  166.     asm_fprintf (FILE, "\tadd.l %0I%d,%Rsp\n", - amt);    \
  167.     }                                \
  168.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  169.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  170.        mask |= 1 << (regno - 16);                \
  171.   if (mask != 0)                        \
  172.     fprintf (FILE, "\tfmovem.x #0x%x,-(sp)\n", mask & 0xff);    \
  173.   mask = 0;                            \
  174.   for (regno = 0; regno < 16; regno++)                \
  175.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  176.        mask |= 1 << (15 - regno);                \
  177.   if (frame_pointer_needed)                    \
  178.     mask &= ~ (1 << (15-FRAME_POINTER_REGNUM));            \
  179.   if (exact_log2 (mask) >= 0)                    \
  180.     fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[15 - exact_log2 (mask)]);  \
  181.   else if (mask) fprintf (FILE, "\tmovem.l #0x%x,-(sp)\n", mask); }
  182.  
  183. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  184.    fprintf (FILE, "\tmove.l #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  185.  
  186. #define FUNCTION_EPILOGUE(FILE, SIZE) \
  187. { register int regno;                        \
  188.   register int mask, fmask;                    \
  189.   register int nregs;                        \
  190.   int offset, foffset;                        \
  191.   extern char call_used_regs[];                    \
  192.   int fsize = ((SIZE) + 3) & -4;                \
  193.   int big = 0;                            \
  194.   nregs = 0;  fmask = 0;                    \
  195.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  196.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  197.       { nregs++; fmask |= 1 << (23 - regno); }            \
  198.   foffset = nregs * 12;                        \
  199.   nregs = 0;  mask = 0;                        \
  200.   if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
  201.   for (regno = 0; regno < 16; regno++)                \
  202.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  203.       { nregs++; mask |= 1 << regno; }                \
  204.   offset = foffset + nregs * 4;                    \
  205.   if (offset + fsize >= 0x8000                     \
  206.       && frame_pointer_needed                    \
  207.       && (mask || fmask))                    \
  208.     { fprintf (FILE, "\tmove.l #%d,a0\n", -fsize);        \
  209.       fsize = 0, big = 1; }                    \
  210.   if (exact_log2 (mask) >= 0) {                    \
  211.     if (big)                            \
  212.       fprintf (FILE, "\tmove.l (-%d,fp,a0.l),%s\n",        \
  213.            offset + fsize, reg_names[exact_log2 (mask)]);    \
  214.     else if (! frame_pointer_needed)                \
  215.       fprintf (FILE, "\tmove.l (sp)+,%s\n",            \
  216.            reg_names[exact_log2 (mask)]);            \
  217.     else                            \
  218.       fprintf (FILE, "\tmove.l (-%d,fp),%s\n",            \
  219.            offset + fsize, reg_names[exact_log2 (mask)]); }    \
  220.   else if (mask) {                        \
  221.     if (big)                            \
  222.       fprintf (FILE, "\tmovem.l (-%d,fp,a0.l),#0x%x\n",        \
  223.            offset + fsize, mask);                \
  224.     else if (! frame_pointer_needed)                \
  225.       fprintf (FILE, "\tmovem.l (sp)+,#0x%x\n", mask);        \
  226.     else                            \
  227.       fprintf (FILE, "\tmovem.l (-%d,fp),#0x%x\n",        \
  228.            offset + fsize, mask); }                \
  229.   if (fmask) {                            \
  230.     if (big)                            \
  231.       fprintf (FILE, "\tfmovem.x (-%d,fp,a0.l),#0x%x\n",    \
  232.            foffset + fsize, fmask);                \
  233.     else if (! frame_pointer_needed)                \
  234.       fprintf (FILE, "\tfmovem.x (sp)+,#0x%x\n", fmask);    \
  235.     else                            \
  236.       fprintf (FILE, "\tfmovem.x (-%d,fp),#0x%x\n",        \
  237.            foffset + fsize, fmask); }            \
  238.   if (frame_pointer_needed)                    \
  239.     fprintf (FILE, "\tunlk fp\n");                \
  240.   else if (fsize)                        \
  241.     {                                \
  242.       if (fsize + 4 < 0x8000)                    \
  243.     fprintf (FILE, "\tadd.w #%d,sp\n", fsize + 4);        \
  244.       else                            \
  245.     fprintf (FILE, "\tadd.l #%d,sp\n", fsize + 4);        \
  246.     }                                \
  247.   if (current_function_pops_args)                \
  248.     fprintf (FILE, "\trtd #%d\n", current_function_pops_args);    \
  249.   else fprintf (FILE, "\trts\n"); }
  250.  
  251. /* Difference from m68k.h is in `fp' instead of `a6'.  */
  252.  
  253. #define REGISTER_NAMES \
  254. {"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",    \
  255.  "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",    \
  256.  "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"}
  257.  
  258. /* This is how to output an insn to push a register on the stack.
  259.    It need not be very fast code.  */
  260.  
  261. #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
  262.   fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[REGNO])
  263.  
  264. /* This is how to output an insn to pop a register from the stack.
  265.    It need not be very fast code.  */
  266.  
  267. #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
  268.   fprintf (FILE, "\tmove.l (sp)+,%s\n", reg_names[REGNO])
  269.   
  270. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)  \
  271. do { char dstr[30];                    \
  272.      REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);    \
  273.      fprintf (FILE, "\t.double 0d%s\n", dstr);        \
  274.    } while (0)
  275.  
  276. #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
  277.   fprintf (FILE, "\t.space %u\n", (SIZE))
  278.  
  279. #if 0
  280. /* The NEWS assembler in version 3.4 complains about fmove.d, but this
  281.    macro proved not to work right.  3.4 is old, so forget about it. */
  282. #define ASM_OUTPUT_OPCODE(FILE, STRING) \
  283. {                        \
  284.   if (!strncmp (STRING, "fmove.d", 7)        \
  285.       && CONSTANT_P (operands[1]))        \
  286.     {                        \
  287.       fprintf (FILE, "fmove.x");        \
  288.       STRING += 7;                \
  289.     }                        \
  290. }
  291. #endif
  292.  
  293. /* Store in OUTPUT a string (made with alloca) containing
  294.    an assembler-name for a local static variable named NAME.
  295.    LABELNO is an integer which is different for each call.  */
  296.  
  297. #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)    \
  298. ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 13),    \
  299.   sprintf ((OUTPUT), "%s$$$%d", (NAME), (LABELNO)))
  300.  
  301. #define PRINT_OPERAND(FILE, X, CODE)  \
  302. { if (CODE == '.') fprintf (FILE, ".");                    \
  303.   else if (CODE == '#') fprintf (FILE, "#");                \
  304.   else if (CODE == '-') fprintf (FILE, "-(sp)");            \
  305.   else if (CODE == '+') fprintf (FILE, "(sp)+");            \
  306.   else if (CODE == '@') fprintf (FILE, "(sp)");                \
  307.   else if (CODE == '!') fprintf (FILE, "fpcr");                \
  308.   else if (CODE == '$') {if (TARGET_68040_ONLY) fprintf (FILE, "s");}    \
  309.   else if (CODE == '&') {if (TARGET_68040_ONLY) fprintf (FILE, "d");}    \
  310.   else if (CODE == '/')                            \
  311.     ;                                    \
  312.   else if (GET_CODE (X) == REG)                        \
  313.     fprintf (FILE, "%s", reg_names[REGNO (X)]);                \
  314.   else if (GET_CODE (X) == MEM)                        \
  315.     output_address (XEXP (X, 0));                    \
  316.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)    \
  317.     { REAL_VALUE_TYPE r;                        \
  318.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  319.       if (CODE == 'f')                            \
  320.         { char dstr[30];                        \
  321.           REAL_VALUE_TO_DECIMAL (r, "%.9e", dstr);            \
  322.           if (REAL_VALUE_ISINF (r) || REAL_VALUE_ISNAN (r)) {        \
  323.             if (REAL_VALUE_NEGATIVE (r))                \
  324.               fprintf (FILE, "#0f-99e999");                \
  325.             else                            \
  326.               fprintf (FILE, "#0f99e999"); }                \
  327.           else if (REAL_VALUE_MINUS_ZERO (r))                \
  328.             fprintf (FILE, "#0f-0.0");                    \
  329.           else                                \
  330.             fprintf (FILE, "#0f%s", dstr);                 \
  331.         }                                \
  332.       else                                \
  333.         { long l;                            \
  334.           REAL_VALUE_TO_TARGET_SINGLE (r, l);                \
  335.           fprintf (FILE, "#0x%x", l);                    \
  336.         }}                                \
  337.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == XFmode)    \
  338.     { REAL_VALUE_TYPE r;                        \
  339.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  340.       ASM_OUTPUT_LONG_DOUBLE_OPERAND (FILE, r); }            \
  341.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode)    \
  342.     { REAL_VALUE_TYPE r; char dstr[30];                    \
  343.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  344.       REAL_VALUE_TO_DECIMAL (r, "%.20e", dstr );            \
  345.       if (REAL_VALUE_ISINF (r) || REAL_VALUE_ISNAN (r)) {        \
  346.         if (REAL_VALUE_NEGATIVE (r))                    \
  347.           fprintf (FILE, "#0d-99e999");                    \
  348.         else                                \
  349.           fprintf (FILE, "#0d99e999"); }                \
  350.       else if (REAL_VALUE_MINUS_ZERO (r))                \
  351.           fprintf (FILE, "#0d-0.0");                    \
  352.       else                                \
  353.           fprintf (FILE, "#0d%s", dstr); }                \
  354.   else if (CODE == 'b') output_addr_const (FILE, X);            \
  355.   else { putc ('#', FILE); output_addr_const (FILE, X); }}
  356.  
  357. #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
  358. { register rtx reg1, reg2, breg, ireg;                    \
  359.   register rtx addr = ADDR;                        \
  360.   rtx offset;                                \
  361.   switch (GET_CODE (addr))                        \
  362.     {                                    \
  363.     case REG:                                \
  364.       fprintf (FILE, "(%s)", reg_names[REGNO (addr)]);            \
  365.       break;                                \
  366.     case PRE_DEC:                            \
  367.       fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);    \
  368.       break;                                \
  369.     case POST_INC:                            \
  370.       fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);    \
  371.       break;                                \
  372.     case PLUS:                                \
  373.       reg1 = 0;    reg2 = 0;                        \
  374.       ireg = 0;    breg = 0;                        \
  375.       offset = 0;                            \
  376.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))                \
  377.     {                                \
  378.       offset = XEXP (addr, 0);                    \
  379.       addr = XEXP (addr, 1);                    \
  380.     }                                \
  381.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))            \
  382.     {                                \
  383.       offset = XEXP (addr, 1);                    \
  384.       addr = XEXP (addr, 0);                    \
  385.     }                                \
  386.       if (GET_CODE (addr) != PLUS) ;                    \
  387.       else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)        \
  388.     {                                \
  389.       reg1 = XEXP (addr, 0);                    \
  390.       addr = XEXP (addr, 1);                    \
  391.     }                                \
  392.       else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)        \
  393.     {                                \
  394.       reg1 = XEXP (addr, 1);                    \
  395.       addr = XEXP (addr, 0);                    \
  396.     }                                \
  397.       else if (GET_CODE (XEXP (addr, 0)) == MULT)            \
  398.     {                                \
  399.       reg1 = XEXP (addr, 0);                    \
  400.       addr = XEXP (addr, 1);                    \
  401.     }                                \
  402.       else if (GET_CODE (XEXP (addr, 1)) == MULT)            \
  403.     {                                \
  404.       reg1 = XEXP (addr, 1);                    \
  405.       addr = XEXP (addr, 0);                    \
  406.     }                                \
  407.       else if (GET_CODE (XEXP (addr, 0)) == REG)            \
  408.     {                                \
  409.       reg1 = XEXP (addr, 0);                    \
  410.       addr = XEXP (addr, 1);                    \
  411.     }                                \
  412.       else if (GET_CODE (XEXP (addr, 1)) == REG)            \
  413.     {                                \
  414.       reg1 = XEXP (addr, 1);                    \
  415.       addr = XEXP (addr, 0);                    \
  416.     }                                \
  417.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT        \
  418.       || GET_CODE (addr) == SIGN_EXTEND)                \
  419.     { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; }    \
  420.       if (offset != 0) { if (addr != 0) abort (); addr = offset; }    \
  421.       if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND            \
  422.             || GET_CODE (reg1) == MULT))            \
  423.       || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))        \
  424.     { breg = reg2; ireg = reg1; }                    \
  425.       else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))        \
  426.     { breg = reg1; ireg = reg2; }                    \
  427.       if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF)    \
  428.         { int scale = 1;                        \
  429.       if (GET_CODE (ireg) == MULT)                    \
  430.         { scale = INTVAL (XEXP (ireg, 1));                \
  431.           ireg = XEXP (ireg, 0); }                    \
  432.       if (GET_CODE (ireg) == SIGN_EXTEND)                \
  433.         fprintf (FILE, "(L%d.b,pc,%s.w",                \
  434.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  435.              reg_names[REGNO (XEXP (ireg, 0))]);         \
  436.       else                                \
  437.         fprintf (FILE, "(L%d.b,pc,%s.l",                \
  438.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  439.              reg_names[REGNO (ireg)]);                \
  440.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  441.       putc (')', FILE);                        \
  442.       break; }                            \
  443.       if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF)    \
  444.         { fprintf (FILE, "(L%d.b,pc,%s.l",                \
  445.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  446.            reg_names[REGNO (breg)]);                \
  447.       putc (')', FILE);                        \
  448.       break; }                            \
  449.       if (ireg != 0 || breg != 0)                    \
  450.     { int scale = 1;                        \
  451.       if (breg == 0)                        \
  452.         abort ();                            \
  453.       if (addr && GET_CODE (addr) == LABEL_REF) abort ();        \
  454.       fprintf (FILE, "(");                        \
  455.       if (addr != 0) {                        \
  456.         output_addr_const (FILE, addr);                \
  457.         putc (',', FILE); }                        \
  458.       fprintf (FILE, "%s", reg_names[REGNO (breg)]);        \
  459.       if (ireg != 0)                        \
  460.         putc (',', FILE);                        \
  461.       if (ireg != 0 && GET_CODE (ireg) == MULT)            \
  462.         { scale = INTVAL (XEXP (ireg, 1));                \
  463.           ireg = XEXP (ireg, 0); }                    \
  464.       if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)        \
  465.         fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]);    \
  466.       else if (ireg != 0)                        \
  467.         fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]);        \
  468.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  469.       putc (')', FILE);                        \
  470.       break;                            \
  471.     }                                \
  472.       else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF)        \
  473.     { fprintf (FILE, "(L%d.b,pc,%s.l)",                \
  474.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  475.            reg_names[REGNO (reg1)]);                \
  476.       break; }                            \
  477.     default:                                \
  478.       if (GET_CODE (addr) == CONST_INT                    \
  479.       && INTVAL (addr) < 0x8000                    \
  480.       && INTVAL (addr) >= -0x8000)                    \
  481.     fprintf (FILE, "%d.w", INTVAL (addr));                \
  482.       else                                \
  483.         output_addr_const (FILE, addr);                    \
  484.     }}
  485.  
  486. #else /* Using GAS, which uses the MIT assembler syntax, like a Sun.  */
  487.  
  488. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  489.    fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  490.  
  491. #endif /* MOTOROLA */
  492.